// 多行字符串
// let str = 'admin';
// console.log(`hi ${str}`);

// 展开运算符，数组展开后赋值给函数形参
// let funct = (a,b) => {
//     console.log(a,b);
// }
// funct(...[1,2,3]);

// Object的扩展
/**
 * Object.keys()
 * Object.values()
 * Object.entries()
 */
// const obj = {
//     name: 'dlc',
//     age: '29'
// }
// console.log(Object.keys(obj)) // [ 'name', 'age' ] 
// console.log(Object.values(obj))// [ 'dlc', '29' ]
// console.log(Object.entries(obj))// [ [ 'name', 'dlc' ], [ 'age', '29' ] ]

// const cc = 'admin';
// const obj = {
//     [cc]:1
// };

// const cc = 'admin';
// const obj = {
//     cc
// }
// console.log(obj); // { cc: 'admin' }

// const obj = {
//     admin(){

//     }
// }

// const obj1 = {a:1,b:2}
// const obj2 = {c:3,d:4}
// console.log({...obj1,...obj2}); // 还能起到值传递，对新的对象修改不会影响其它赋值对象  后面对象如果Key相同会覆盖前面的。

// const obj = {a:1,b:2};
// let {a,b} = obj;
// const obj2 = [3,4];
// let [c,d] = obj2;
// console.log(a,b,c,d);

// class
// 是prototype的语法糖
// extends 继承
// Constructor构造
// class P{
//     constructor(){

//     }
//     say(){

//     }
// }
// class C extends P{

// }
// new C().say();

// 数据结构
// Set 不可重复
// let o1 = [1,2,3];
// let o2 = [1,2,3];
// let c = [...o1,...o2];
// let s = [...new Set(c)];
// console.log(s);
// Map 和java里面的那个map差不多
// const o1 = {
//     id:1,
//     name:'dlc'
// }
// const o2 = {
//     id:2,
//     name:'jll'
// }
// const mp = new Map();
// mp.set(o1, [1,2,3]);
// mp.set(o2, [4,5,6]);

// console.log(mp.get(o1), mp.get(o2));
// console.log(mp)

// Symbol
// https://www.cnblogs.com/sker/p/5474591.html

// 模块化
/**
 * import
 * export
 * 
 * export const name = 1; 导出需要带名称 export default不需要比如 export default ()=>{}
 * 导入
 * import {a} from '导出' 如果是默认的 import a from 'default导出的'
 * 
 * export default const a = 1; 这样定义错误 default 后面不能有定义变量的关键字
 * 
 * import * as obj from ''
 * obj......
 * 
 */

 // 其它
 /**
  * 对象扩展符，函数绑定
  * 装饰器 https://segmentfault.com/p/1210000009968000/read
  * Async await https://segmentfault.com/a/1190000007535316
  */

//   let a = () => {
//       let p = new Promise((resolve, reject)=>{
//           setTimeout(()=>{
//             reject(123)
//           },4000)
//       });
//       return p;
//   }
//   let b = () => {
//     let p = new Promise((resolve, reject)=>{
//         setTimeout(()=>{
//             resolve(321)
//         },4000)
//     });
//     return p;
//   }
//   async function c(){
//       try{
//       let as = await a();
//       let bs = await b();
//       console.log(as,bs)
//       }catch(e){
//         console.log(e);
//       }
      
//   }
//   c()

// babel http://babeljs.io/docs/plugins/preset-stage-0/

// 数组遍历
// [1,2,3].forEach((v, k) => {
//   console.log(k, v);
// });

// console.log([1,2,3].map((v, k)=>{
//   return v*2;
// }))

// // every 是否所有元素都通过测试
// console.log([1,2,3,4].every((r) => r > 3))

// // some 是否有元素满足条件
// console.log([1,2,3,4].some((r) => r > 3))

// // filter 过滤满足条件的数组
// console.log([1,2,3,4].filter((r) => r > 3))

// indexOf 判断匹配元素下标

// 去除重复 [...new Set([...a1,...a2])]
// console.log([...new Set([...[1,2],...[1,2]])])

// reduce 返回值带入下次
// console.log([1,2,3].reduce((v, sum)=>{
//   return sum += v;
// },0))

// 后去第一个剩下的扔给数组c
// const [a, ...c] = [1,2,3,4].reverse();
// console.log(a, c)
// const {a, ...b} = {
//   a:1,
//   b:2,
//   c:3
// }
// console.log(a,b);